#include <iostream>
#include <algorithm>
#include <cstdio>
#define maxm 100005
using namespace std;
#include <string.h>
//哈希函数映射，取余10003
//单独构造一个哈希求键值的函数
//还需要单独创建一个单链表来表示身份证号用来找出相同的项进行合并
struct node{
    char s[20];
    int v;
    struct node *next;//指向与其发生冲突的节点的指针
    node(){v=0;next=NULL;}
};//哈希节点的构造
node h[maxm];

int Hash(char s[])//哈希转换函数
{
    int idx = 0,i;
    for( i = 0; i < 17; i++)
    {
        idx = (idx*10 + s[i]-'0')%10003;
    }
    if(s[i]=='x') idx = (idx*10 + 11)%10003;
    else idx = (idx*10 + s[i]-'0')%10003;
    return idx;

}
void add(int idx,char s[],int v)//向哈希表中添加节点并合并相同项
{
    int flag=0;//标记
    node *fp=&h[idx];
    node *sp=h[idx].next;
    while(sp)
    {
        if(!strcmp(sp->s,s))//相同的话，返回值是0，代表如果存在的话，在原本基础上加上本次飞的距离
        {
            sp->v+=v;
            flag=1;
            break;
        }
        fp=sp;
        sp=sp->next;//一直循环寻找本hashid下的人
    }
    //都没有找到说明不存在，创建一个新的存贮
    if(!flag)
    {
        fp->next=new node();
        strcpy(fp->next->s,s);
        fp->next->v=v;
    }
}
void find(char s[])//哈希查找
{
    int idx=Hash(s);
    node *fp=&h[idx];
    node *sp=h[idx].next;
    int flag1=0;
    while (sp)
    {
        if (strcmp(sp->s,s) == 0)
        {
            printf("%d\n", sp->v);
            flag1=1;
            break;
        }
        fp = sp;
        sp = sp->next;
    }
    if (!flag1)
        printf("No Info\n");

}
int main()
{
    int n,l;
    cin>>n>>l;
    char s[20];
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%s %d",s,&x);
        if(x<l)
            x=l;
        int m=Hash(s);
        add(m,s,x);
    }
    int k;
    scanf("%d",&k);
    for(int i=0;i<k;i++)
    {
        scanf("%s",s);
        find(s);
    }
    return 0;
}